package com.hsh.acte 
{
	import com.hsh.graph.Etat;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.ui.Mouse;
	import flash.ui.MouseCursor;
	/**
	 * Aventure : suite de 3 actions avec un même héros ;-)
	 * @author Jean-Marie@home
	 */
	public class Tenue extends Enfoncement
	{	
		/**
		 * mouseMove ou enterFrame ?  
		 */
		protected var mobile:Boolean; 
		/**
		 * action de la tenue
		 */
		protected var boucle:Function;  
		/**
		 * callback de la tenue 
		 */
		protected var callback:Function; 
		/**
		 * position de départ de l'Actif 
		 */
		protected var _base:Point;

		/**
		 * Suite de 3 actions : enfoncement, [tenue/mouvement], relachement
		 * @param	actif	élément actif 
		 * @param	developpement	fonction appelée en boucle pendant la tenue
		 * @param	action	callback recevant l'actif et l'événement
		 * @param	bBouge	réagir au mouvement (true) ou à la tenue (false) ?
		 */
		public function Tenue(actif:Actif, developpement:Function, action:Function, bBouge:Boolean) 
		{
			super(actif, surDebut);
			mobile = bBouge;
			boucle = developpement;
			callback = action;
		}
		
		/**
		 * Début de la tenue
		 * @param	a	actif
		 * @param	e	mouseDown
		 */
		private function surDebut(a:Actif, e:MouseEvent):void
		{
			_base = new Point(a.gauche, a.haut);
			a.diffuseur.addEventListener(MouseEvent.RELEASE_OUTSIDE, surFin);
			scene.addEventListener(MouseEvent.MOUSE_UP, surFin);
			scene.addEventListener( mobile ? MouseEvent.MOUSE_MOVE : Event.ENTER_FRAME, surBoucle);
			callback(a, e);
			a.mettreDevant();
			surBoucle(e);
		}
		
		/**
		 * Tenue	effectue l'appel interne puis le callback
		 * @param	e mouseMove ou enterFrame
		 */
		private function surBoucle(e:Event):void 
		{
			boucle(a, e);
			callback(a, e);
		}
		
		/**
		 * Fin de la tenue
		 * @param	e mouseUp
		 */
		private function surFin(e:MouseEvent):void
		{
			a.etat = Etat.RELACHEMENT;
			Mouse.cursor = MouseCursor.AUTO;
			a.diffuseur.removeEventListener(MouseEvent.RELEASE_OUTSIDE, surFin);
			scene.removeEventListener(MouseEvent.MOUSE_UP, surFin);
			scene.removeEventListener( mobile ? MouseEvent.MOUSE_MOVE : Event.ENTER_FRAME, surBoucle);
			callback(a, e); 
			if (a != null && e.type == MouseEvent.RELEASE_OUTSIDE) a.etat = Etat.SORTIE;
		}
	}
}